package brcl.utils;

import brcl.constant.BrclConstant;
import cn.hutool.core.io.FileUtil;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * bean对象转json文件
 *
 * @version v1.0
 * @className: HvmUtils
 * @author: heyiheng
 * @date: 2021-04-13 17:21
 */
@Slf4j
public class JsonToListBeanUtils {
    private static final String SUBST = ".json";
    public static final String START_ARRAY = "[";
    public static final String END_ARRAY = "]";

    /**list or bean —> string */
    public static String CopyToString (Object jsonSource) {
        return new Gson().toJson(jsonSource);
    }

    /**string —> bean */
    public static <T> T copyToBean(String jsonSource, Class<T> clazz) {
        return new Gson().fromJson(jsonSource, clazz);
    }

    /**string —> list<T> */
    public static <T> List<T> copyStringToList(String jsonSource, Class<T> tC) {
        List<T> listT = new ArrayList<>();
        //json字符串不能为空
        if(StringUtils.isBlank(jsonSource)) {
            return null;
        }
        //json字符串必须为数组节点类型 若不是则认为是单个bean
        if(!(jsonSource.startsWith(START_ARRAY) && jsonSource.endsWith(END_ARRAY))) {
            listT.add(copyToBean(jsonSource, tC));
            return listT;
        }
        try {
            //创建泛型对象
            T t =  tC.newInstance();
            //利用类加载加载泛型的具体类型
            Class<T> classT = (Class<T>) Class.forName(t.getClass().getName());
            List<Object> listObj;
            //将数组节点中json字符串转换为object对象到Object的list集合
            listObj = new GsonBuilder().create().fromJson(jsonSource, new TypeToken<List<Object>>(){}.getType());
            //转换未成功
            if(listObj == null || listObj.isEmpty()) {
                return null;
            }
            //将Object的list中的的每一个元素中的json字符串转换为泛型代表的类型加入泛型代表的list集合返回
            for (Object obj : listObj) {
                T perT = new GsonBuilder().create().fromJson(obj.toString(), classT);
                listT.add(perT);
            }
        } catch (Exception e) {
            log.error("", e);
        }
        return listT;
    }


    /**转储本地持久化*/
    public static String creatNewJsonFile(String jsonSource) {
        String name = "account";
        String account = name + File.separator;
        if (!FileUtil.exist(account)) {
            FileUtil.mkdir(account);
        }
        //文件名称
        String fileName = name + SUBST;
        File file1 = FileUtil.writeBytes(jsonSource.getBytes(), BrclConstant.PATH + fileName);
        return file1.getPath();
    }

    public static void delFile(){
        FileUtil.del(BrclConstant.PATH + "account.json");
    }

    public static void main(String[] args) {
        delFile();
    }

    /**
     * 通过本地文件访问json并读取
     *
     * @param path：json文件路径
     * @return：json文件的内容
     */
    public static String readFile(String path) {
        StringBuilder laststr = new StringBuilder();
        List<String> strings = FileUtil.readLines(path, "UTF-8");
        for (String string : strings) {
            laststr.append(string.trim());
        }
        return laststr.toString();
    }

}
